package com.chaike.hsq.bean.request.merchant;

import com.chaike.hsq.bean.request.BaseHsqRequest;
import com.chaike.hsq.bean.response.merchant.MerchantIncomingResponse;
import com.chaike.hsq.consts.HsqMerchantEnum;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.List;

/**
 * 慧收钱 商户进件 请求参数.
 *
 * @author Luo
 * @version 1.0
 * @date 2021-10-14 10:36
 */
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MerchantIncomingRequest extends BaseHsqRequest<MerchantIncomingResponse> implements Serializable {

    private static final long serialVersionUID = 5190642453439420460L;

    /**
     * <pre>
     * 字段名：进件请求流水号.
     * 变量名：transNo
     * 是否必填：是
     * 类型：string
     * 描述：
     *    商户请求进件唯一流水号，每次请求不可重复
     * </pre>
     */
    private String transNo;

    /**
     * <pre>
     * 字段名：商户全称.
     * 变量名：merchantName
     * 是否必填：是
     * 类型：string
     * 描述：
     *    营业执照上的名称一致
     * </pre>
     */
    private String merchantName;

    /**
     * <pre>
     * 字段名：商户简称.
     * 变量名：merchantShortName
     * 是否必填：是
     * 类型：string
     * 描述：
     *    支付时显示收单方
     * </pre>
     */
    private String merchantShortName;

    /**
     * <pre>
     * 字段名：客服电话.
     * 变量名：servicePhone
     * 是否必填：是
     * 类型：string
     * 描述：
     *
     * </pre>
     */
    private String servicePhone;

    /**
     * <pre>
     * 字段名：联系邮箱.
     * 变量名：email
     * 是否必填：是
     * 类型：string
     * 描述：
     *    登录/接收邮件
     * </pre>
     */
    private String email;

    /**
     * <pre>
     * 字段名：经营类目.
     * 变量名：industryType
     * 是否必填：是
     * 类型：string
     * 描述：
     *    详见附录[经营类目]
     * </pre>
     */
    private String industryType;

    /**
     * <pre>
     * 字段名：行业.
     * 变量名：business
     * 是否必填：是
     * 类型：string
     * 描述：
     *    详见附录[行业]
     * </pre>
     */
    private String business;

    /**
     * <pre>
     * 字段名：企业经营范围.
     * 变量名：businessCope
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    与营业执照上一致
     * </pre>
     */
    private String businessCope;

    /**
     * <pre>
     * 字段名：企业证件类型.
     * 变量名：merchantIdType
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    默认营业执照
     *    NATIONAL_LEGAL：营业执照
     *    NATIONAL_LEGAL_MERGE：营业执照(多证合一)
     *    INST_RGST_CTF：事业单位法人证书
     * </pre>
     */
    private String merchantIdType;

    /**
     * <pre>
     * 字段名：企业证件编号.
     * 变量名：businessLicense
     * 是否必填：是
     * 类型：string
     * 描述：
     *    企业/个体证件编号编号
     * </pre>
     */
    private String businessLicense;

    /**
     * <pre>
     * 字段名：企业注册地址.
     * 变量名：registeredAddress
     * 是否必填：是
     * 类型：string
     * 描述：
     *    与营业执照上一致
     * </pre>
     */
    private String registeredAddress;

    /**
     * <pre>
     * 字段名：企业证件到期日.
     * 变量名：licenseOverdueTime
     * 是否必填：是
     * 类型：string
     * 描述：
     *
     * </pre>
     */
    private String licenseOverdueTime;

    /**
     * <pre>
     * 字段名：业务场景.
     * 变量名：merchantIdType
     * 是否必填：是
     * 类型：string
     * 描述：
     *    多个逗号隔开，详见附录:[业务场景]
     * </pre>
     */
    private String companyScene;

    /**
     * <pre>
     * 字段名：商户公钥.
     * 变量名：publicKey
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    具备开发能力代理商将其商户自有公钥（cer）文件
     *    文件里面的内容以字符串形式进行传输至平台，平台生成对应公钥，
     *    商户需要存储该信息用于其支付交易；
     * 说明：加解密可参考[加密机制]
     * </pre>
     */
    private String publicKey;

    /**
     * <pre>
     * 字段名：通知地址.
     * 变量名：returnUrl
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    上送后则通过该地址主动通知结果
     * </pre>
     */
    private String returnUrl;

    //=============地址信息=============

    /**
     * <pre>
     * 字段名：地区编码.
     * 变量名：districtCode
     * 是否必填：是
     * 类型：string
     * 描述：
     *    商户具备收单能力时需要详见附录[省市编码]
     * </pre>
     */
    private String districtCode;

    /**
     * <pre>
     * 字段名：地址.
     * 变量名：address
     * 是否必填：是
     * 类型：string
     * 描述：
     *
     * </pre>
     */
    private String address;

    /**
     * <pre>
     * 字段名：经度.
     * 变量名：longitude
     * 是否必填：选填
     * 类型：string
     * 描述：
     *
     * </pre>
     */
    private String longitude;

    /**
     * <pre>
     * 字段名：纬度.
     * 变量名：latitude
     * 是否必填：选填
     * 类型：string
     * 描述：
     *
     * </pre>
     */
    private String latitude;

    //=============法人信息=============

    /**
     * <pre>
     * 字段名：法人姓名.
     * 变量名：legalName
     * 是否必填：是
     * 类型：string
     * 描述：
     *
     * </pre>
     */
    private String legalName;

    /**
     * <pre>
     * 字段名：法人证件号码.
     * 变量名：legalIdcardNo
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    与营业执照上一致
     * </pre>
     */
    private String legalIdcardNo;

    /**
     * <pre>
     * 字段名：法人证件类型.
     * 变量名：legalIdcardType
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    默认身份证，详见附录[证件类型]
     * </pre>
     */
    private String legalIdcardType;

    /**
     * <pre>
     * 字段名：法人证件过期时间.
     * 变量名：legalCertEndDate
     * 是否必填：是
     * 类型：string
     * 描述：
     *
     * </pre>
     */
    private String legalCertEndDate;

    /**
     * <pre>
     * 字段名：法人手机号码.
     * 变量名：legalPhone
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    联系人为法人时手机号码为必填
     * </pre>
     */
    private String legalPhone;

    /**
     * <pre>
     * 字段名：国籍.
     * 变量名：nationality
     * 是否必填：是
     * 类型：string
     * 描述：
     *    中国
     * </pre>
     */
    private String nationality;

    //=============联系人信息=============

    /**
     * <pre>
     * 字段名：联系人姓名.
     * 变量名：contactName
     * 是否必填：是
     * 类型：string
     * 描述：
     *    联系人类型为法人时与法人信息一致
     * </pre>
     */
    private String contactName;

    /**
     * <pre>
     * 字段名：联系人手机号.
     * 变量名：contactPhone
     * 是否必填：是
     * 类型：string
     * 描述：
     *    联系人类型为法人时与法人信息一致
     * </pre>
     */
    private String contactPhone;

    /**
     * <pre>
     * 字段名：联系人证件类型.
     * 变量名：contactIdcardType
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    默认身份证,详见附录[证件类型]
     * </pre>
     */
    private String contactIdcardType;

    /**
     * <pre>
     * 字段名：联系人证件过期时间.
     * 变量名：contactCertEndDate
     * 是否必填：是
     * 类型：string
     * 描述：
     *    联系人类型为法人时与法人信息一致
     * </pre>
     */
    private String contactCertEndDate;

    /**
     * <pre>
     * 字段名：联系人证件号.
     * 变量名：contactIdcardNo
     * 是否必填：是
     * 类型：string
     * 描述：
     *    联系人类型为法人时与法人信息一致
     * </pre>
     */
    private String contactIdcardNo;

    /**
     * <pre>
     * 字段名：联系人类型.
     * 变量名：contactType
     * 是否必填：某条件成立时必须填写的域
     * 类型：string
     * 描述：
     *    默认法人
     *    LEGAL_PERSON:法人
     *    CONTROLLER:实际控制人
     *    AGENT:代理人
     *    OTHER:其他
     * </pre>
     */
    private String contactType;

    /**
     * <pre>
     * 字段名：支付宝账号.
     * 变量名：contactLogonId
     * 是否必填：某条件成立时必须填写的域
     * 类型：string
     * 描述：
     *    支付宝账号开通支付宝支付时必填
     * </pre>
     */
    private String contactLogonId;

    /**
     * <pre>
     * 字段名：微信账号.
     * 变量名：contactWeChatId
     * 是否必填：某条件成立时必须填写的域
     * 类型：string
     * 描述：
     *    微信账号开通微信支付时必填
     * </pre>
     */
    private String contactWeChatId;

    /**
     * <pre>
     * 字段名：联系人QQ.
     * 变量名：qq
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    联系人QQ
     * </pre>
     */
    private String qq;

    //=============结算信息=============

    /**
     * <pre>
     * 字段名：银行卡号.
     * 变量名：bankCardNo
     * 是否必填：是
     * 类型：string
     * 描述：
     *
     * </pre>
     */
    private String bankCardNo;

    /**
     * <pre>
     * 字段名：联行号.
     * 变量名：cnapsNo
     * 是否必填：是
     * 类型：string
     * 描述：
     *    详见附录[联行号]
     * </pre>
     */
    private String cnapsNo;

    /**
     * <pre>
     * 字段名：银行卡户名类型.
     * 变量名：cardNameType
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    取值：
     *    1：企业名称（商户全称）；
     *    2：法人姓名；
     * 说明：该值暂时只能支持个体工商户；
     * </pre>
     */
    private String cardNameType;

    //=============影像资料=============

    /**
     * <pre>
     * 字段名：法人身份证正面.
     * 变量名：idCardFrontImg
     * 是否必填：是
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String idCardFrontImg;

    /**
     * <pre>
     * 字段名：法人身份证反面.
     * 变量名：idCardBackImg
     * 是否必填：是
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String idCardBackImg;

    /**
     * <pre>
     * 字段名：法人手持身份证照.
     * 变量名：idCardHandImg
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String idCardHandImg;

    /**
     * <pre>
     * 字段名：门头照.
     * 变量名：storeImg
     * 是否必填：是
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String storeImg;

    /**
     * <pre>
     * 字段名：营业场所照片.
     * 变量名：placeImg
     * 是否必填：是
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String placeImg;

    /**
     * <pre>
     * 字段名：企业证件照.
     * 变量名：businessLicenseImg
     * 是否必填：是
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String businessLicenseImg;

    /**
     * <pre>
     * 字段名：开户许可证.
     * 变量名：bankLicenseImg
     * 是否必填：是
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String bankLicenseImg;

    /**
     * <pre>
     * 字段名：平台协议.
     * 变量名：protocolImg
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String protocolImg;

    /**
     * <pre>
     * 字段名：统一社会信用代码.
     * 变量名：socialCreditCodeImgUrl
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String socialCreditCodeImgUrl;

    /**
     * <pre>
     * 字段名：工商网截图.
     * 变量名：icNetScreenShotUrl
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String icNetScreenShotUrl;

    /**
     * <pre>
     * 字段名：icp备案照片.
     * 变量名：icpImg
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String icpImg;

    /**
     * <pre>
     * 字段名：组织机构代码证照片.
     * 变量名：orgCodeImg
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String orgCodeImg;

    /**
     * <pre>
     * 字段名：其它图片.
     * 变量名：otherImgs
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    最多支持六张多个逗号（,）隔开对应资质文件上传接口返回的fileId
     * </pre>
     */
    private String otherImgs;

    //=============预留信息=============

    /**
     * <pre>
     * 字段名：扩展字段.
     * 变量名：extend1
     * 是否必填：选填
     * 类型：string
     * 描述：
     *    与营业执照上一致
     * </pre>
     */
    private String extend1;

    //=============产品信息=============

    /**
     * <pre>
     * 字段名：产品属性.
     * 变量名：productType
     * 是否必填：是
     * 类型：string
     * 描述：
     *    1.不分账、2.收单分账、3.账户分账、4.组合支付
     * </pre>
     */
    private String productType;

    /**
     * <pre>
     * 字段名：开通产品列表.
     * 变量名：payConfigList
     * 是否必填：是
     * 类型：string
     * 描述：
     *    开通产品列表（payConfigList）JSON集合
     * </pre>
     */
    private List<PayConfig> payConfigList;

    /**
     * 获取请求方法的名称.
     *
     * @return 方法名称
     */
    @Override
    public String getMethodName() {
        return HsqMerchantEnum.Method.AGENT_REGISTER_INDIVIDUAL.getName();
    }

    /**
     * 开通产品信息.
     */
    @Data
    @Accessors(chain = true)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class PayConfig implements Serializable {

        private static final long serialVersionUID = -1842025261687308636L;

        /**
         * <pre>
         * 字段名：产品编码.
         * 变量名：powerId
         * 是否必填：是
         * 类型：string
         * 描述：
         *    支付功能
         * </pre>
         *
         * @see com.chaike.hsq.consts.HsqMerchantEnum.PayFeature
         */
        private String powerId;

        /**
         * <pre>
         * 字段名：费率.
         * 变量名：merchantIdType
         * 是否必填：是
         * 类型：string
         * 描述：
         *    单位: 例5=0.5%
         * </pre>
         */
        private String rate;

        /**
         * <pre>
         * 字段名：扩展字段1.
         * 变量名：extend1
         * 是否必填：选填
         * 类型：string
         * 描述：
         *
         * </pre>
         */
        private String extend1;

    }

}
